SICP 习题 1.6
Exercise 1.6. Alyssa P. Hacker doesn't see why if needs to be provided as a special form. “Why can't I just define it as an ordinary procedure in terms of cond?” she asks. Alyssa's friend Eva Lu Ator claims this can indeed be done, and she defines a new version of if:
练习 1.6. Alyssa P. Hacker 不明白为什么需要将其作为特殊形式提供。她问道:“为什么我不能将其定义为 cond 下的普通过程?”Alyssa 的朋友 Eva Lu Ator 声称这确实可以做到,她定义了if 的一个新版本:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
问题的关键在于普通过程和特殊形式在求值时的行为差异:
这也展示了 Scheme/Lisp 中一个重要的概念:并不是所有看起来等价的实现都真的等价,求值顺序和求值规则会产生重要影响。
特殊形式 if 的行为
当使用内置的特殊形式 if 时,解释器会:
- 首先求值[000.wiki/谓词|谓词]部分
- 根据谓词的结果,只求值其中一个分支(then-clause 或 else-clause)
- 这种行为称为"短路求值"
普通过程 new-if 的行为
作为普通过程,new-if 遵循应用序求值规则:
- 在进入过程体之前,所有参数都会被求值
- 这意味着 then-clause 和 else-clause 都会被求值,不管谓词的结果如何
出问题的行为
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
- else-clause 中包含递归调用
- 由于应用序求值,在判断 good-enough? 之前,就会尝试求值递归调用
- 这导致无限递归,因为每次调用 new-if 都会触发新的 sqrt-iter 调用
- 不会像特殊形式 if 那样在 good-enough? 为真时停止递归
本文作者:Maeiee
本文链接:SICP 习题 1.6
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!